// Copyright Epic Games, Inc. All Rights Reserved.

#include "LyraInputComponent.h"

// 包含头文件

#include "EnhancedInputSubsystems.h"
#include "Player/LyraLocalPlayer.h"
#include "Settings/LyraSettingsLocal.h"

// 包含所需模块：
// - EnhancedInputSubsystems: 增强输入子系统
// - LyraLocalPlayer: 项目本地玩家类
// - LyraSettingsLocal: 本地设置类

#include UE_INLINE_GENERATED_CPP_BY_NAME(LyraInputComponent)

// UE的内联生成代码包含指令

class ULyraInputConfig;

// 前向声明类

// 构造函数
ULyraInputComponent::ULyraInputComponent(const FObjectInitializer& ObjectInitializer)
{
}

// 添加输入映射实现
void ULyraInputComponent::AddInputMappings(const ULyraInputConfig* InputConfig, UEnhancedInputLocalPlayerSubsystem* InputSubsystem) const
{
	check(InputConfig);  // 检查输入配置有效性
	check(InputSubsystem);  // 检查输入子系统有效性

	// 获取本地玩家
	ULyraLocalPlayer* LocalPlayer = InputSubsystem->GetLocalPlayer<ULyraLocalPlayer>();
	check(LocalPlayer);

	// 获取本地设置
	if (ULyraSettingsLocal* LocalSettings = ULyraSettingsLocal::Get())
	{	
		// 遍历所有自定义玩家输入配置
		for (const TPair<FName, FKey>& Pair : LocalSettings->GetCustomPlayerInputConfig())
		{
			// 检查键名和按键是否有效
			if (Pair.Key != NAME_None && Pair.Value.IsValid())
			{
				// 添加玩家映射键到输入子系统
				InputSubsystem->AddPlayerMappedKeyInSlot(Pair.Key, Pair.Value);
			}
		}
	}
}

// 移除输入映射实现
void ULyraInputComponent::RemoveInputMappings(const ULyraInputConfig* InputConfig, UEnhancedInputLocalPlayerSubsystem* InputSubsystem) const
{
	check(InputConfig);
	check(InputSubsystem);

	ULyraLocalPlayer* LocalPlayer = InputSubsystem->GetLocalPlayer<ULyraLocalPlayer>();
	check(LocalPlayer);
	
	// 获取本地设置
	if (ULyraSettingsLocal* LocalSettings = ULyraSettingsLocal::Get())
	{
		// 获取所有已注册的输入配置
		const TArray<FLoadedMappableConfigPair>& Configs = LocalSettings->GetAllRegisteredInputConfigs();
		// 移除所有玩家可映射配置
		for (const FLoadedMappableConfigPair& Pair : Configs)
		{
			InputSubsystem->RemovePlayerMappableConfig(Pair.Config);
		}
		
		// 清除所有玩家映射键
		for (const TPair<FName, FKey>& Pair : LocalSettings->GetCustomPlayerInputConfig())
		{
			InputSubsystem->RemovePlayerMappedKeyInSlot(Pair.Key);
		}
	}
}

// 移除绑定实现
void ULyraInputComponent::RemoveBinds(TArray<uint32>& BindHandles)
{
	// 遍历所有绑定句柄
	for (uint32 Handle : BindHandles)
	{
		// 通过句柄移除绑定
		RemoveBindingByHandle(Handle);
	}
	// 重置绑定句柄数组
	BindHandles.Reset();
}